home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / net / ds5000.md / netDFInt.h < prev    next >
C/C++ Source or Header  |  1992-12-18  |  31KB  |  832 lines

  1. /*
  2.  * netDFInt.h --
  3.  *
  4.  *    External definitions for the DEC 700 FDDI controller.
  5.  *
  6.  * The description of the definitions here come from the DEC 
  7.  * FDDIcontroller 700 Port Specification, Revision 1.1.
  8.  *
  9.  * Copyright 1992 Regents of the University of California
  10.  * Permission to use, copy, modify, and distribute this
  11.  * software and its documentation for any purpose and without
  12.  * fee is hereby granted, provided that the above copyright
  13.  * notice appear in all copies.  The University of California
  14.  * makes no representations about the suitability of this
  15.  * software for any purpose.  It is provided "as is" without
  16.  * express or implied warranty.
  17.  *
  18.  * $Header: /cdrom/src/kernel/Cvsroot/kernel/net/ds5000.md/netDFInt.h,v 1.2 92/06/08 22:45:58 jhh Exp $
  19.  */
  20.  
  21. #ifndef _NETDFINT
  22. #define _NETDFINT
  23.  
  24. #include <netInt.h>
  25. #include <mach.h>
  26. #include <netDFMachInt.h>
  27.  
  28. typedef unsigned short Net_DFReg;
  29.  
  30. #define NET_DF_CLEAR                         0x0000
  31.  
  32. /*
  33.  * RESET bitfields 
  34.  */
  35. #define NET_DF_RESET_UNDEFINED               0xFFFC
  36. #define NET_DF_RESET_DLU_MODE                0x0002
  37. #define NET_DF_RESET_RESET                   0x0001
  38.  
  39. /*
  40.  * PORT_CONTROL_A bitfields
  41.  */
  42. #define NET_DF_CTRLA_MB_PARITY_ERROR         0x8000
  43. #define NET_DF_CTRLA_NXM_ERR                 0x4000
  44. #define NET_DF_CTRLA_UNDEFINED               0x3F80
  45. #define NET_DF_CTRLA_SMT_RCV_OVERFLOW        0x0040
  46. #define NET_DF_CTRLA_FLUSH_DONE              0x0020
  47. #define NET_DF_CTRLA_SHUT                    0x0010
  48. #define NET_DF_CTRLA_HALT                    0x0008
  49. #define NET_DF_CTRLA_CMD_POLL_DEMAND         0x0004
  50. #define NET_DF_CTRLA_SMT_RCV_POLL_DEMAND     0x0002
  51. #define NET_DF_CTRLA_XMT_POLL_DEMAND         0x0001
  52.  
  53. /*
  54.  * PORT_CONTROL_B bitfields
  55.  */
  56. #define NET_DF_CTRLB_UNDEFINED               0xFFFC
  57. #define NET_DF_CTRLB_CONSOLE_MODE            0x0002
  58. #define NET_DF_CTRLB_DRIVER_MODE             0x0001
  59.  
  60. /*
  61.  * PORT_INTERRUPT_EVENT bitfields
  62.  */
  63. #define NET_DF_EVENT_UNDEFINED               0xF000
  64. #define NET_DF_EVENT_DLU_DONE                0x0800
  65. #define NET_DF_EVENT_FLUSH_TX                0x0400
  66. #define NET_DF_EVENT_PM_PARITY_ERROR         0x0200
  67. #define NET_DF_EVENT_MB_PARITY_ERROR         0x0100
  68. #define NET_DF_EVENT_NXM_ERR                 0x0080
  69. #define NET_DF_EVENT_LINK_STATUS_CHANGE      0x0040
  70. #define NET_DF_EVENT_STATE_CHANGE            0x0020
  71. #define NET_DF_EVENT_UNS_POLL_DEMAND         0x0010
  72. #define NET_DF_EVENT_CMD_DONE                0x0008
  73. #define NET_DF_EVENT_SMT_XMT_POLL_DEMAND     0x0004
  74. #define NET_DF_EVENT_RCV_POLL_DEMAND         0x0002
  75. #define NET_DF_EVENT_XMT_PKT_DONE            0x0001
  76.  
  77. /*
  78.  * PORT_STATUS bitfields
  79.  */
  80. #define NET_DF_STATUS_UNDEFINED              0xC000
  81. #define NET_DF_STATUS_DLU_STATUS             0x3000
  82. #define NET_DF_STATUS_LINK_STATUS            0x0800
  83. #define NET_DF_STATUS_ADAPTER_STATE          0x0700
  84. #define NET_DF_STATUS_TEST_HALT_ID           0x00FF
  85.  
  86. /*
  87.  * Definitions of the LINK_STATUS field.
  88.  */
  89. #define NET_DF_LINK_UNAVAILABLE              0x0000
  90. #define NET_DF_LINK_AVAILABLE                0x0800
  91.  
  92.  
  93. /*
  94.  * States enumerating the NET_DF_STATUS_ADAPTER_STATE field
  95.  */
  96. #define NET_DF_STATE_RESETTING               0x0000
  97. #define NET_DF_STATE_UNINITIALIZED           0x0100
  98. #define NET_DF_STATE_INITIALIZED             0x0200
  99. #define NET_DF_STATE_RUNNING                 0x0300
  100. #define NET_DF_STATE_MAINTENANCE             0x0400
  101. #define NET_DF_STATE_HALTED                  0x0500
  102. #define NET_DF_STATE_UNDEFINED1              0x0600
  103. #define NET_DF_STATE_UNDEFINED2              0x0700
  104.  
  105. #define NET_DF_DISABLE_ALL_INT(S)  ((S) = 0x0000)
  106. #define NET_DF_ENABLE_ALL_INT(S)   ((S) = 0xFFFF)
  107. #define NET_DF_CLEAR_ALL_EVENTS(S)   ((S) = 0xFFFF)
  108.  
  109. /*
  110.  * Command structures used on the COMMAND ring to configure the FDDI
  111.  * adapter.  The COMMAND RING uses command descriptors located on
  112.  * the adapter:
  113.  *
  114.  *    31                   0
  115.  *    +--------------------+
  116.  *    | Host Own | Command |
  117.  *    +--------------------+
  118.  *    |   Command Status   |
  119.  *    +--------------------+
  120.  *    |   Buffer Address   |
  121.  *    +--------------------+
  122.  *    |      Reserved      |
  123.  *    +--------------------+
  124.  *
  125.  * The following command structures are used as command buffers:
  126.  *
  127.  *    INIT: Configure packet memory, # HOST RCV ring entries, and
  128.  *          initialize counters maintained by the adapter.  Using this
  129.  *          command will change the state of the adapter from 
  130.  *          UNINITIALIZED to INITIALIZED.
  131.  *  MODCAM: Configure the CAM chip for address recognition.
  132.  *   PARAM: Configure Loop Back Mode and default Link Characterists
  133.  *          returned from the successful execution of an INIT command.
  134.  *          The adapter will transition to RUNNING, and will connect
  135.  *          to the FDDI ring.
  136.  */
  137.  
  138. /*
  139.  * Types used in command structures:
  140.  *
  141.  *     NET_DF_ULONG: unsigned 32 bit integer
  142.  *     NET_DF_TIMER: unsigned 32 bit integer in increments of 80ns
  143.  *       NET_DF_PMD: unsigned 32 bit integer
  144.  *   NET_DF_SMT_VER: unsigned 32 bit version number --  Version 6 SMT =
  145.  *                      +----+----+----+----+
  146.  *            offset 0  | 00 | 00 | 00 | 06 |
  147.  *                      +----+----+----+----+
  148.  *      NET_DF_BOOL: unsigned 32 bit integer
  149.  * NET_DF_LOOP_MODE: unsigned 32 bit integer
  150.  *      NET_DF_ADDR: 8 bytes representing a network address, of which
  151.  *                   6 are only used.  The address 08-00-2B-01-02-03
  152.  *                   would be:
  153.  *                      +----+----+----+----+
  154.  *            offset 0  | 01 | 2B | 00 | 08 |
  155.  *                      +----+----+----+----+
  156.  *                      +----+----+----+----+
  157.  *            offset 4  | 00 | 00 | 03 | 02 |
  158.  *                      +----+----+----+----+
  159.  *   NET_DF_VERSION: ROM and FW version numbers represented as ASCII
  160.  *                   characters.  Version 1.0A would be:
  161.  *                      +----+----+----+----+
  162.  *            offset 0  | 40 | 30 | 2E | 31 |
  163.  *                      +----+----+----+----+
  164.  *     NET_DF_COUNT: unsigned 64 bit quantity using 8 consecutive bytes.
  165.  *                   The hex value 0x0011223344556677 would be:
  166.  *                      +----+----+----+----+
  167.  *            offset 0  | 00 | 01 | 02 | 03 |
  168.  *                      +----+----+----+----+
  169.  *                      +----+----+----+----+
  170.  *            offset 4  | 04 | 05 | 06 | 07 |
  171.  *                      +----+----+----+----+
  172.  */
  173.  
  174. typedef unsigned long NET_DF_ULONG;
  175. typedef unsigned long NET_DF_TIMER;
  176. typedef unsigned long NET_DF_PMD;
  177. typedef unsigned long NET_DF_SMT_VER;
  178. typedef unsigned long NET_DF_BOOL;
  179.  
  180. #define NET_DF_FALSE                 0x0
  181. #define NET_DF_TRUE                  0x1
  182.  
  183. /*
  184.  * NET_DF_NO_LOOP is used for normal operation.
  185.  */
  186. typedef unsigned long NET_DF_LOOP_MODE;
  187. #define NET_DF_NO_LOOP               0x0
  188. #define NET_DF_INTERNAL_LOOPBACK     0x1
  189. #define NET_DF_EXTERNAL_LOOPBACK     0x2
  190.  
  191. typedef char NET_DF_ADDR[8];
  192. typedef char NET_DF_VERSION[4];
  193.  
  194. typedef struct NET_DF_COUNT {
  195.     unsigned long count1;
  196.     unsigned long count2;
  197. } NET_DF_COUNT;
  198.  
  199. /*
  200.  * Number of command descriptors and size of command buffers.
  201.  */
  202. #define NET_DF_NUM_COMMAND_DESC      64
  203. #define NET_DF_COMMAND_BUF_SIZE      512
  204. /*
  205.  * A command descriptor.
  206.  */
  207. typedef struct NetDFCommandDesc {
  208.     NET_DF_ULONG    command;   /* [31] Host own; [30-0] The command type */
  209.     NET_DF_ULONG    status;    /* Status of command */
  210.     NET_DF_ULONG    bufAddr;   /* Address of command buffer */
  211.     NET_DF_ULONG    reserved; 
  212. } NetDFCommandDesc;
  213.  
  214.  
  215. /*
  216.  * Buffers used with command descriptors.  They are type cast to
  217.  * the structure appropriate for the command being used 
  218.  * (e.g. NetDFInitCommand), and must be NET_DF_COMMAND_BUF_SIZE bytes long.
  219.  */
  220. typedef char NetDFCommandBuf;
  221.  
  222. #define NET_DF_OWN                   0x80000000
  223. #define NET_DF_HOST_OWN              0x80000000
  224. #define NET_DF_ADAPTER_OWN           0x00000000
  225.  
  226. #define NET_DF_COMMAND_NOP           0x00000000
  227. #define NET_DF_COMMAND_INIT          0x00000001
  228. #define NET_DF_COMMAND_MODCAM        0x00000002
  229. #define NET_DF_COMMAND_PARAM         0x00000003
  230. #define NET_DF_COMMAND_MODPROM       0x00000004
  231. #define NET_DF_COMMAND_SETCHAR       0x00000005
  232. #define NET_DF_COMMAND_RDCNTR        0x00000006
  233. #define NET_DF_COMMAND_STATUS        0x00000007
  234. #define NET_DF_COMMAND_RDCAM         0x00000008
  235.  
  236. #define NET_DF_COMMAND_MASK          0x0000000F
  237.  
  238. #define NET_DF_COMMAND_STATUS_OK     0x00000000
  239.  
  240. /* 
  241.  * Location of the COMMAND ring in adapter memory.
  242.  */
  243. #define NET_DF_COMMAND_RING_OFFSET   NET_DF_MACH_COMMAND_RING_OFFSET
  244.  
  245.  
  246. /*
  247.  * INIT command values supplied by the driver (us).  
  248.  */
  249. #define NET_DF_INIT_TRANSMIT_MODE    0x0
  250. #define NET_DF_INIT_HOST_RCV_ENTRIES 0x20
  251. #define NET_DF_INIT_COUNTER_VALUE    0x0
  252.  
  253. /*
  254.  * INIT command structure.
  255.  */
  256. typedef struct NetDFInitCommand {
  257.     NET_DF_ULONG    transmitMode;    /*
  258.                       * setting  #RMC XMT  #RMC RCV
  259.                       *   0         512       1024
  260.                       *   1        1024        512
  261.                       */
  262.     NET_DF_ULONG    rcvEntries;      /* # Host RCV entries (2-256) */
  263.     NET_DF_COUNT    sysBufUnavail;   /* System Buffer Unavailable Counter */
  264.     NET_DF_COUNT    xmtUnder;        /* Transmit Underruns */
  265.     NET_DF_COUNT    xmtFail;         /* Transmit Failures */
  266.     NET_DF_COUNT    rcvDataOver;     /* Receive Data Overruns */ 
  267.     NET_DF_COUNT    frameCnt;        /* Frame Count */
  268.     NET_DF_COUNT    errorCnt;        /* Error Count */
  269.     NET_DF_COUNT    lostCnt;         /* Lost Count */
  270.     NET_DF_COUNT    ringInitStart;   /* Ring Initialization Initiated */
  271.     NET_DF_COUNT    ringInitRcvd;    /* Ring Initialization Received */
  272.     NET_DF_COUNT    ringBeaconStart; /* Ring Beacon Initiated */
  273.     NET_DF_COUNT    dupAddrTestFail; /* Duplicate Address Test Failures */
  274.     NET_DF_COUNT    dupTokenDetect;  /* Duplicate Token Detected */
  275.     NET_DF_COUNT    ringPurgeErr;    /* Ring Purge Errors */
  276.     NET_DF_COUNT    bridgeStripErr;  /* Bridge Strip Errors */
  277.     NET_DF_COUNT    tracesStart;     /* Traces Initiated */
  278.     NET_DF_COUNT    tracesRcvd;      /* Traces Received */
  279.     NET_DF_COUNT    lemReject;       /* LEM Rejects */
  280.     NET_DF_COUNT    tneExpReject;    /* TNE Exp Rejects */
  281.     NET_DF_COUNT    lemEvents;       /* LEM Events */
  282.     NET_DF_COUNT    lctRejects;      /* LCT Rejects */
  283.     NET_DF_COUNT    connectComplete; /* Connections Completed */
  284.     NET_DF_COUNT    elastBufErr;     /* Elasticity Buffer Errors */
  285.     NET_DF_VERSION  pmcRevision;     /* NOT DOCUMENTED */
  286.     NET_DF_VERSION  romRevison;      /* ROM Revision # */
  287.     NET_DF_VERSION  fwRevison;       /* Firmware Revision # */
  288.     NET_DF_ULONG    mopDeviceType;   /* MOP Device Type */
  289.     NET_DF_ULONG    hostRcvBase;     /* Base Addr of Host RCV Descriptor */
  290.     NET_DF_ULONG    rmcXmtBase;      /* Base Addr of RMC XMT Descriptor */
  291.     NET_DF_ULONG    rmcXmtEntries;   /* Number of RMC XMT Descriptor Entries */
  292.     NET_DF_ULONG    smtXmtBase;      /* Base Addr of SMT XMT Descriptor */
  293.     NET_DF_ULONG    smtXmtEntries;   /* Number of SMT XMT Descriptor Entries */
  294.     NET_DF_ULONG    smtRcvBase;      /* Base Addr of SMT RCV Descriptor */
  295.     NET_DF_ULONG    smtRcvEntries;   /* Number of SMT RCV Descriptor Entries */
  296.     NET_DF_ADDR     linkAddress;     /* Link Address */
  297.     NET_DF_TIMER    defaultTReq;     /* Default T_REQ */
  298.     NET_DF_TIMER    defaultTvx;      /* Default TVX */
  299.     NET_DF_TIMER    defaultTMax;     /* NOT DOCUMENTED */
  300.     NET_DF_ULONG    lemThresh;       /* NOT DOCUMENTED */
  301.     NET_DF_COUNT    stationID;       /* NOT DOCUMENTED */
  302.     NET_DF_ULONG    reserved6;       /* The following below may be outdated */
  303.     NET_DF_SMT_VER  smtVersionID;    /* SMT Verison ID */
  304.     NET_DF_TIMER    tokenTimeout;    /* Restricted Token Timeout */
  305.     NET_DF_BOOL     ringPurgeEnable; /* Ring Purger Enable */
  306.     NET_DF_SMT_VER  smtMaxVersionID; /* SMT Maximum Version ID */
  307.     NET_DF_SMT_VER  smtMinVersionID; /* SMT MinimumVersion ID */
  308.     NET_DF_PMD      pmdType;         /* PMD Type */
  309. } NetDFInitCommand;
  310.  
  311. /*
  312.  * A MODCAM command structure is just 64 NET_DF_ADDRs
  313.  */
  314. typedef NET_DF_ADDR NetDFModcamCommand;
  315.  
  316. /*
  317.  * CAM addresses that must be loaded:
  318.  *
  319.  * Ring Purger Multicast:       09-00-2b-02-01-05
  320.  * Directed Beacon Multicast:   01-80-c2-00-01-00
  321.  *
  322.  * The adapter memory does not seem to be byte-writeable (although
  323.  * it is byte-readable), so load the entries by words.  This is
  324.  * probably not machine independent, but then the DEC FDDI will probably
  325.  * only run on DECstations...(an excuse)
  326.  */
  327.  
  328. #define NET_DF_MODCAM_RING_PURGE_LOW     0x022b0009
  329. #define NET_DF_MODCAM_RING_PURGE_HIGH    0x00000501
  330. #define NET_DF_MODCAM_BEACON_LOW         0x00c28001
  331. #define NET_DF_MODCAM_BEACON_HIGH        0x00000001
  332.  
  333.  
  334. /*
  335.  * A RDCAM command structure is just 64 NET_DF_ADDRs
  336.  */
  337. typedef NET_DF_ADDR NetDFRdcamCommand;
  338.  
  339. /*
  340.  * A MODPROM command structure.
  341.  */
  342. typedef struct NetDFModpromCommand {
  343.     NET_DF_BOOL      llcPromEnable;   /* LLC Promiscuous Enable */
  344.     NET_DF_BOOL      smtPromEnable;   /* SMT Promiscuous Enable */
  345.     NET_DF_BOOL      llcMultiEnable;  /* LLC Multicast Promiscuous Enable */
  346.     NET_DF_BOOL      llcBroadEnable;  /* LLC Broadcast Promiscuous Enable */
  347. } NetDFModpromCommand;
  348.  
  349. /*
  350.  * PARAM command structure.
  351.  */
  352. typedef struct NetDFParamCommand {
  353.     NET_DF_LOOP_MODE loopMode;        /* Loop Back Mode */
  354.     NET_DF_ULONG     tMax;            /* NOT DOCUMENTED */
  355.     NET_DF_TIMER     tReq;            /* Requested token rotation timer */
  356.     NET_DF_TIMER     tvx;             /* Valid transmission time */
  357.     NET_DF_ULONG     lemThresh;       /* NOT DOCUMENTED */
  358.     NET_DF_COUNT     stationID;       /* NOT DOCUMENTED */
  359.     NET_DF_TIMER     tokenTimeout;    /* Restricted token timeout */
  360.     NET_DF_BOOL      ringPurgeEnable; /* Ring Purger Enable */
  361. } NetDFParamCommand;
  362.  
  363. /*
  364.  * A STATUS command structure.
  365.  */
  366. typedef struct NetDFStatusCommand {
  367.     NET_DF_ULONG     ledState;        /* State of the LED in the back */
  368.     NET_DF_ULONG     reserved1;
  369.     NET_DF_ULONG     linkState;       /* State of the link to the ring */
  370.     NET_DF_ULONG     dupAddrFlag;     /* Duplicate Address Flag */
  371.     NET_DF_ULONG     ringPurgeState;  /* Ring Purger State */
  372.     NET_DF_TIMER     negTrt;          /* Negotiated Target Rotation Time */
  373.     NET_DF_ADDR      upNeighborAddr;  /* Upstream Neighbor Address */
  374.     NET_DF_ULONG     unaTimedout;     /* UNA Timed Out */
  375.     NET_DF_ULONG     frameStrip;      /* Frame Strip Mode */
  376.     NET_DF_ULONG     claimToken;      /* Claim Token Yield Mode */
  377.     NET_DF_ULONG     phyState;        /* Phy State */
  378. } NetDFStatusCommand;
  379.  
  380. /*
  381.  * Host RCV descriptor and buffer.  The DEC FDDI adapter transfers data
  382.  * from the ring into these buffers, which are referenced by the
  383.  * descriptors.  FDDI packets can have a size of 4.5K, and the DEC
  384.  * adapter requires that the host split the buffer up into two buffers,
  385.  * one of size 4K and the other 0.5K.  The Host RCV descpritor points to
  386.  * these two buffers, in addition to the own bit.
  387.  */
  388. typedef struct NetDFHostRcvDesc {
  389.     unsigned long *bufAPtr;    /* [31] = host own; [30-25] = reserved;
  390.                     * [24-0] = (4K buffer address >> 9) */
  391.     unsigned long *bufBPtr;    /* [31-25] = reserved;
  392.                     * [24-0] = (0.5K buffer address >> 9) */
  393.     unsigned long rmcRcvDesc;  /* RMC RCV descriptor */
  394.     unsigned long reserved;
  395. } NetDFHostRcvDesc;
  396.  
  397. /*
  398.  * The manual says the lower 25 bits form the address, but its picture
  399.  * says 22 bits...which is all we need anyways.
  400.  */
  401. #define NET_DF_HOST_RCV_BUFA_MASK    0x007FFFFF
  402. #define NET_DF_HOST_RCV_BUFB_MASK    0x007FFFFF
  403.  
  404. #define NET_DF_HOST_RCV_BUF_SIZE     4608
  405. #define NET_DF_HOST_RCV_BUFA_SIZE    4096
  406. #define NET_DF_HOST_RCV_BUFB_SIZE    512
  407. /*
  408.  * RMC RCV descriptor fields
  409.  */
  410. #define NET_DF_RMC_RCV_SOP           0x80000000
  411. #define NET_DF_RMC_RCV_EOP           0x40000000
  412. #define NET_DF_RMC_RCV_FSC           0x38000000
  413. #define NET_DF_RMC_RCV_FSB           0x07C00000
  414. #define NET_DF_RMC_RCV_BAD           0x00200000
  415. #define NET_DF_RMC_RCV_CRC           0x00100000
  416. #define NET_DF_RMC_RCV_RRR           0x000E0000  /* MAC receive status */
  417. #define NET_DF_RMC_RCV_DD            0x00018000
  418. #define NET_DF_RMC_RCV_SS            0x00006000
  419. #define NET_DF_RMC_RCV_PBC           0x00001FFF
  420. /*
  421.  * RRR (MAC receive status) definitions
  422.  */
  423. #define NET_DF_RRR_MAC_RESET         0x000E0000
  424. #define NET_DF_RRR_FORMAT_ERROR      0x000C0000
  425. #define NET_DF_RRR_FRAGMENT          0x000A0000
  426. #define NET_DF_RRR_INV_LENGTH        0x00080000
  427. #define NET_DF_RRR_RMC_ABORT         0x00060000
  428. #define NET_DF_RRR_DADDR_UNMATCH     0x00040000
  429. #define NET_DF_RRR_SADDR_MATCH       0x00020000
  430. #define NET_DF_RRR_NORMAL            0x00000000
  431. /*
  432.  * DD (Destination Address match status) definitions
  433.  */
  434. #define NET_DF_DD_LOCAL              0x00018000
  435. #define NET_DF_DD_CAM                0x00010000
  436. #define NET_DF_DD_PROM               0x00008000
  437. #define NET_DF_DD_NONE               0x00000000
  438. /*
  439.  * SS (Source Address match status) definitions.  These are only
  440.  * valid when the adapter is in loopback mode.
  441.  */
  442. #define NET_DF_SS_LOCAL              0x00006000
  443. #define NET_DF_SS_CAM                0x00004000
  444. #define NET_DF_SS_ALIAS              0x00002000
  445. #define NET_DF_SS_NONE               0x00000000
  446.  
  447. typedef struct NetDFHostRcvBuf {
  448.     unsigned char bufA[NET_DF_HOST_RCV_BUFA_SIZE];
  449.     unsigned char bufB[NET_DF_HOST_RCV_BUFB_SIZE];
  450. } NetDFHostRcvBuf;
  451.  
  452. /*
  453.  * Remove to have the receive buffers cached.
  454.  *
  455.  * #define NET_DF_USE_UNCACHED_MEM
  456.  */
  457.  
  458. /*
  459.  * The number of HOST RCV entries
  460.  */
  461. #define NET_DF_NUM_HOST_RCV_ENTRIES  NET_DF_INIT_HOST_RCV_ENTRIES
  462.  
  463. /*
  464.  * SMT RCV ring descriptor and buffer definitions
  465.  */
  466. typedef struct NetDFSmtRcvDesc {
  467.     unsigned long own;         /* [31] = 0 adapter own; = 1 host own
  468.                 * [30-0] reserved */
  469.     unsigned long rmcRcvDesc;  /* RMC RCV Descriptor */
  470.     unsigned long bufAddr;    /* Address of buffer */
  471.     unsigned long reserved;  
  472. } NetDFSmtRcvDesc;
  473.  
  474. #define NET_DF_SMT_RCV_BUF_SIZE      4608
  475. typedef char NetDFSmtRcvBuf[NET_DF_SMT_RCV_BUF_SIZE];
  476.  
  477. /*
  478.  * UNSOLICITED ring descriptor definition.
  479.  */
  480. typedef struct NetDFUnsolDesc {
  481.     unsigned long own;         /* [31] = 0 adapter own; = 1 host own
  482.                 * [30-0] reserved */
  483.     unsigned long eventID;     /* Unsolicited event ID */
  484.     unsigned long bufAddr;     /* Address of event buffer */
  485.     unsigned long reserved;
  486. } NetDFUnsolDesc;
  487.  
  488. #define NET_DF_UNSOL_UNDEFINED       0x0
  489. #define NET_DF_UNSOL_RING_INIT_INIT  0x1
  490. #define NET_DF_UNSOL_RING_INIT_RCV   0x2
  491. #define NET_DF_UNSOL_BEACON_INIT     0x3
  492. #define NET_DF_UNSOL_DUP_ADDR        0x4
  493. #define NET_DF_UNSOL_DUP_TOKEN       0x5
  494. #define NET_DF_UNSOL_PURGE_ERROR     0x6
  495. #define NET_DF_UNSOL_STRIP_ERROR     0x7
  496. #define NET_DF_UNSOL_OP_OSCILLAT     0x8
  497. #define NET_DF_UNSOL_BEACON_RCV      0x9
  498. #define NET_DF_UNSOL_PC_TRACE_INIT   0xA
  499. #define NET_DF_UNSOL_PC_TRACE_RECV   0xB
  500. #define NET_DF_UNSOL_XMT_UNDERRUN    0xC
  501. #define NET_DF_UNSOL_XMT_FAILURE     0xD
  502. #define NET_DF_UNSOL_RCV_OVERRUN     0xE
  503.  
  504. /*
  505.  * Only one of the unsolicited events (Directed Beacon Received Event)
  506.  * actually uses a buffer.
  507.  */
  508. typedef struct NetDFDirectedBeacon {
  509.     NET_DF_ADDR sourceAddr;  /* Directed Beacon source address */
  510.     NET_DF_ADDR una;         /* UNA of Directed Beacon Source */
  511. } NetDFDirectedBeacon;
  512.  
  513. /*
  514.  * SMT XMT ring descriptor definition.  The 4.5 Kbyte buffers associated with
  515.  * the descriptors are on the adapter board itself.  We don't really
  516.  * have to do much with these except transfer valid ones to the RMC XMT ring.
  517.  */
  518. typedef struct NetDFSmtXmtDesc {
  519.     unsigned long own;         /* [31] = 0 adapter own; = 1 host own
  520.                 * [30-0] reserved */
  521.     unsigned long pbc;         /* RMC XMT PBC */
  522.     unsigned long bufAddr;     /* Address of buffer, long word boundary */
  523.     unsigned long reserved;
  524. } NetDFSmtXmtDesc;    
  525.  
  526. #define NET_DF_SMT_XMT_BUF_SIZE      4608
  527.  
  528. typedef char NetDFSmtXmtBuf[NET_DF_SMT_XMT_BUF_SIZE];
  529.  
  530. /*
  531.  * RMC XMT ring descriptor definition.  The 512 byte buffers associated with
  532.  * the descriptors are on the adapter.  To transmit stuff > 512 bytes, we
  533.  * have to chain these things.  Yummy yummy.
  534.  */
  535. typedef struct NetDFRmcXmtDesc {
  536.     unsigned long rmcXmtDesc;    /* RMC XMT Descriptor */
  537.     unsigned long hostReserved; /* Reserved for us? Wow! */
  538.     unsigned long own;          /* [31] = 1 adapter own; = 0 host own
  539.                  * Note that this protocol is opposite
  540.                  * all other own-bit protocols.
  541.                  * [30-0] reserved */
  542.     unsigned long reserved;
  543. } NetDFRmcXmtDesc;    
  544.  
  545. #define NET_DF_RMC_OWN               0x80000000
  546. #define NET_DF_RMC_ADAPTER_OWN       0x80000000
  547. #define NET_DF_RMC_HOST_OWN          0x00000000
  548.  
  549. #define NET_DF_RMC_XMT_BUF_SIZE      512
  550. #define NET_DF_RMC_XMT_BUF_HDR_SIZE  16
  551. #define NET_DF_RMC_XMT_BUF_DATA_SIZE 496
  552.  
  553. typedef char NetDFRmcXmtBuf[NET_DF_RMC_XMT_BUF_SIZE];
  554.  
  555. #define NET_DF_MAX_PACKET_SIZE       4480
  556. #define NET_DF_MIN_MAC_PACKET_SIZE   17
  557. #define NET_DF_MIN_SMT_PACKET_SIZE   37
  558. #define NET_DF_MIN_LLC_PACKET_SIZE   20
  559. #define NET_DF_MIN_IMP_PACKET_SIZE   17
  560. #define NET_DF_MIN_RES_PACKET_SIZE   17
  561.  
  562. #define NET_DF_RMC_XMT_SOP           0x80000000
  563. #define NET_DF_RMC_XMT_EOP           0x40000000
  564. #define NET_DF_RMC_XMT_DTP           0x20000000
  565. #define NET_DF_RMC_XMT_VBC           0x10000000
  566. #define NET_DF_RMC_XMT_DCC           0x0F000000
  567. #define NET_DF_RMC_XMT_RES           0x00C00000
  568. #define NET_DF_RMC_XMT_XPO           0x003FE000
  569. #define NET_DF_RMC_XMT_PBC           0x00001FFF
  570. /*
  571.  * Typical assignment values to the RMC XMT descriptor
  572.  */
  573. #define NET_DF_RMC_XMT_ONE_PAGE      0xD0000000
  574. #define NET_DF_RMC_XMT_FIRST_PAGE    0x90000000
  575. #define NET_DF_RMC_XMT_MIDDLE_PAGE   0x00000000
  576. #define NET_DF_RMC_XMT_LAST_PAGE     0x40000000
  577. /*
  578.  * DCC (DMA Completion Code) definitions.
  579.  */
  580. #define NET_DF_DCC_SUCCESS           0x01000000
  581.  
  582. /*
  583.  * Typical PRH (Packet Request Header) byte values
  584.  */
  585. #define NET_DF_PRH0                  0x20
  586. #define NET_DF_PRH1                  0x28
  587. #define NET_DF_PRH2                  0x00
  588. /*
  589.  * Default Frame Control types and values.
  590.  */
  591. #define    NET_DF_FRAME_CLASS            0x80
  592. #define    NET_DF_FRAME_ADDR_LENGTH      0x40
  593. #define    NET_DF_FRAME_FORMAT           0x30
  594. #define    NET_DF_FRAME_CONTROL          0x0F
  595.  
  596. #define NET_DF_FRAME_HOST_LLC         0x54
  597. #define NET_DF_FRAME_VOID             0x40
  598. #define NET_DF_FRAME_NON_REST_TOK     0x80
  599. #define NET_DF_FRAME_REST_TOK         0xc0             
  600. #define NET_DF_FRAME_SMT_INFO         0x41
  601. #define NET_DF_FRAME_SMT_NSA          0x4F
  602. #define NET_DF_FRAME_MAC_BEACON       0xc2
  603. #define NET_DF_FRAME_MAC_CLAIM        0xc3
  604. #define NET_DF_FRAME_LLC_ASYNC        0x50
  605. #define NET_DF_FRAME_LLC_SYNC         0xD0
  606. #define NET_DF_FRAME_IMP_ASYNC        0x60
  607. #define NET_DF_FRAME_IMP_SYNC         0xe0
  608. #define NET_DF_FRAME_SMT              0x40
  609. #define NET_DF_FRAME_MAC              0xc0
  610.  
  611. /*
  612.  * A transmission queue used to shelve packets while one is 
  613.  * being sent.
  614.  */
  615.  
  616. /*
  617.  * Length of the transmission queue.
  618.  */
  619. #define NET_DF_NUM_XMIT_ELEMENTS     32
  620. #define NET_DF_XMT_HOST              0x1
  621. #define NET_DF_XMT_SMT               0x2
  622.  
  623. typedef struct NetDFXmtElement {
  624.     List_Links        links;
  625.     Net_FDDIHdr       *fddiHdrPtr;          /* FDDI header with address of
  626.                          * receiver already set */
  627.     Net_ScatterGather *scatterGatherPtr;    /* Scatter/gather array */
  628.     int               scatterGatherLength;  /* Size of scatter/gather array */
  629.     NetDFSmtXmtDesc   *smtDescPtr;          /* SMT Descriptor to transmit */
  630.     Boolean           xmtType;              /* Either XMT_HOST or XMT_SMT */
  631. } NetDFXmtElement;
  632.  
  633. /*
  634.  * Structure to hold all state information associated with 
  635.  * the FDDI adapter board.
  636.  */
  637. typedef struct {
  638.     List_Links        xmitListHdr;    /* List of packets to be transmited. */
  639.     List_Links        *xmitList;    /* Pointer to the front of the list of
  640.                        packets to be transmited. */
  641.     List_Links        xmitFreeListHdr; /* List of unused packets. */
  642.     List_Links          *xmitFreeList;    /* Pointer to a list of unused 
  643.                        transmission queue elements. */
  644.     volatile char       *slotAddr;         /* option slot base address */
  645.  
  646.     volatile Net_DFReg  *regReset;         /* RESET Register */
  647.     volatile Net_DFReg  *regCtrlA;         /* PORT_CONTROL_A register */
  648.     volatile Net_DFReg  *regCtrlB;         /* PORT_CONTROL_B register */
  649.     volatile Net_DFReg  *regStatus;        /* PORT_STATUS register */
  650.     volatile Net_DFReg  *regEvent;         /* PORT_INTERRUPT_EVENT register */
  651.     volatile Net_DFReg  *regMask;          /* PORT_INTERRUPT_MASK register */
  652.  
  653.     volatile NetDFCommandDesc *comRingPtr; /* Base address for the command
  654.                         * descriptor memory */
  655.     volatile NetDFCommandDesc *comNextPtr; /* Command descriptor after last
  656.                         * one previously used */
  657.     volatile NetDFCommandDesc *comLastPtr; /* Last command descriptor that
  658.                         * can be used */
  659.     volatile NetDFCommandBuf  *comBufPtr;  /* Base address for the command
  660.                         * buffer memory region */
  661.     volatile NetDFInitCommand *initComPtr;    /* INIT command buffer */
  662.     volatile unsigned char    *errLogPtr;  /* Base address of Error Log */
  663.  
  664.     volatile NetDFHostRcvDesc *hostRcvFirstDescPtr;
  665.     volatile NetDFHostRcvDesc *hostRcvNextDescPtr;
  666.     volatile NetDFHostRcvDesc *hostRcvLastDescPtr;
  667.  
  668.     volatile NetDFHostRcvBuf  *hostRcvFirstBufPtr;
  669.     volatile NetDFHostRcvBuf  *hostRcvNextBufPtr;
  670.     volatile NetDFHostRcvBuf  *hostRcvLastBufPtr;
  671. #ifndef NET_DF_USE_UNCACHED_MEM
  672.     volatile NetDFHostRcvBuf  *hostRcvBuffers[NET_DF_NUM_HOST_RCV_ENTRIES];
  673.      int              hostRcvBufIndex;
  674. #endif
  675.  
  676.     volatile NetDFSmtRcvDesc  *smtRcvFirstDescPtr;
  677.     volatile NetDFSmtRcvDesc  *smtRcvNextDescPtr;
  678.     volatile NetDFSmtRcvDesc  *smtRcvLastDescPtr;
  679.  
  680.     volatile NetDFSmtXmtDesc  *smtXmtFirstDescPtr;
  681.     volatile NetDFSmtXmtDesc  *smtXmtNextDescPtr;
  682.     volatile NetDFSmtXmtDesc  *smtXmtLastDescPtr;
  683.  
  684.     volatile NetDFRmcXmtDesc  *rmcXmtFirstDescPtr;
  685.     volatile NetDFRmcXmtDesc  *rmcXmtBatchDescPtr;
  686.     volatile NetDFRmcXmtDesc  *rmcXmtNextDescPtr;
  687.     volatile NetDFRmcXmtDesc  *rmcXmtLastDescPtr;
  688.     volatile NetDFRmcXmtBuf   *rmcXmtFirstBufPtr;
  689.  
  690.     volatile NetDFUnsolDesc   *unsolFirstDescPtr;
  691.     volatile NetDFUnsolDesc   *unsolNextDescPtr;
  692.     volatile NetDFUnsolDesc   *unsolLastDescPtr;
  693.  
  694.     unsigned long             flags;    /* State of the adapter. */
  695.                                         /* Used for iocontrol transmits. */
  696.     Net_ScatterGather         scatterArray[NET_DF_NUM_XMIT_ELEMENTS];
  697.     Net_FDDIHdr               headerArray[NET_DF_NUM_XMIT_ELEMENTS];
  698.     int                       scatterIndex;
  699.  
  700.     Sync_Condition      doingReset;     /* Condition to wait for resetting
  701.                        to finish. */
  702.     Boolean        transmitting;    /* Set if are currently transmitting a
  703.                        packet. */
  704.     Boolean             hostTransmit;   /* Set if we are transmitting a
  705.                      * host packet (non-SMT) */
  706.     Boolean        running;    /* Is the chip currently active. */
  707.     Boolean             booting;        /* Is this during boot? */
  708.     Boolean        recvMemInitialized;    /* Flag for initializing
  709.                          * kernel memory. */
  710.     Boolean        recvMemAllocated;    /* Flag for allocating
  711.                          * memory for ring buffers. */
  712.     Net_ScatterGather     *curScatGathPtr;  /* Pointer to scatter gather element 
  713.                        * for current packet being sent. */
  714.     volatile NetDFSmtXmtDesc  *curSmtXmtDescPtr; /* Pointer to SMT XMT desc
  715.                           * for current packet */
  716.     char        *firstDataBuffer; /* Buffer used to ensure that
  717.                        * first element is of a minimum
  718.                        * size. */
  719.     Boolean        xmitMemInitialized; /* Flag to note if xmit memory
  720.                          * has been initialized. */
  721.     Boolean        xmitMemAllocated; /* Flag to note if xmit memory
  722.                        * has been allocated. */
  723.     Net_Interface    *interPtr;    /* Pointer back to network interface. */
  724.     Net_FDDIStats    stats;        /* Performance statistics. */
  725.     int            numResets;    /* Number of times the chip has
  726.                      * been reset. */
  727.     Boolean        resetPending;    /* TRUE => chip should be reset when
  728.                      * current transmit is done. */
  729.     int            lastRecvCnt;    /* Number of packets done during
  730.                      * last receive interrupt. */
  731.     int            lastUnsolCnt;    /* Number of unsolicited events done
  732.                      * during last unsol interrupt. */
  733.     unsigned char          loopBackBuffer[NET_DF_MAX_PACKET_SIZE]; 
  734.                                         /* Buffer for the
  735.                      * loopback address. */
  736.     Net_FDDIAddress    fddiAddress;       /* The FDDI address */
  737. } NetDFState;
  738.  
  739. /*
  740.  * Flags to determine adapter state
  741.  */
  742. #define NET_DF_FLAGS_NORMAL              0x00000001
  743. #define NET_DF_FLAGS_RESETTING           0x00000002
  744. #define NET_DF_FLAGS_SYSLOG              0x00000004
  745. #define NET_DF_FLAGS_HALTED        0x00000008
  746.  
  747. /*
  748.  * Debug ring.
  749.  */
  750. #define NET_DF_DEBUG_RING_SIZE       20
  751. extern char *netDFDebugRing[];
  752. extern int  netDFDebugRingIndex;
  753.  
  754. #define MAKE_NOTE(message) \
  755. netDFDebugRing[netDFDebugRingIndex] = (message); \
  756. netDFDebugRingIndex = (netDFDebugRingIndex + 1) % NET_DF_DEBUG_RING_SIZE
  757.  
  758. extern void             NetDFPrintDebugRing _ARGS_((NetDFState *statePtr));
  759.  
  760. /*
  761.  * General routines.
  762.  */
  763. #define IncScatterIndex(statePtr) \
  764.     statePtr->scatterIndex = (statePtr->scatterIndex + 1) % \
  765.         NET_DF_NUM_XMIT_ELEMENTS
  766.  
  767.  
  768. #define NET_DF_DEBUG_OFF             0x0
  769. #define NET_DF_DEBUG_ON              0x1
  770.  
  771. extern int netDFDebug;
  772.  
  773. #ifndef lint
  774. #define DFprintf \
  775.   if (netDFDebug == NET_DF_DEBUG_ON) printf
  776. #else
  777. #define DFprintf printf
  778. #endif
  779.  
  780. extern    ReturnStatus    NetDFInit _ARGS_((Net_Interface *interPtr));
  781. extern    ReturnStatus    NetDFOutput _ARGS_((Net_Interface *interPtr,
  782.                 Address hdrPtr,Net_ScatterGather *scatterGatherPtr,
  783.                 int scatterGatherLength, Boolean rpc,
  784.                 ReturnStatus *statusPtr));
  785.  
  786. extern ReturnStatus     NetDFSmtOutput _ARGS_((Net_Interface *interPtr));
  787.  
  788. extern void             NetDFPrintStateAddrs _ARGS_((void));
  789. extern void             NetDFPrintNextRmc _ARGS_((NetDFState *statePtr));
  790.  
  791. extern    void        NetDFIntr _ARGS_((Net_Interface *interPtr, 
  792.                 Boolean polling));
  793. extern ReturnStatus     NetDFIOControl _ARGS_((Net_Interface *interPtr, 
  794.                 Fs_IOCParam *ioctlPtr, Fs_IOReply *replyPtr));
  795.  
  796. extern void             Net_DFRestart _ARGS_((Net_Interface *interPtr));
  797. extern    void        NetDFReset _ARGS_((Net_Interface *interPtr));
  798.  
  799. extern    ReturnStatus    NetDFGetStats _ARGS_((Net_Interface *interPtr, 
  800.                 Net_Stats *statPtr));
  801. extern    ReturnStatus    NetDFMachInit _ARGS_ ((Net_Interface *interPtr,
  802.                 NetLEState *statePtr));
  803.  
  804. extern void NetDFPrintRegContents _ARGS_((NetDFState *statePtr));
  805. extern void NetDFPrintErrorLog _ARGS_((NetDFState *statePtr));
  806.  
  807. /*
  808.  * Routines for transmitting.
  809.  */
  810.  
  811. extern  void            NetDFBcopy    _ARGS_((unsigned char *startPtr,
  812.                           unsigned char *destPtr,
  813.                           unsigned long numBytes));
  814. extern    void        NetDFXmitInit _ARGS_((NetDFState *statePtr));
  815. extern    ReturnStatus    NetDFXmitDone _ARGS_((NetDFState *statePtr));
  816.  
  817. extern    void        NetDFXmitRestart _ARGS_((NetDFState *statePtr));
  818.  
  819. extern    void        NetDFXmitDrop _ARGS_((NetDFState *statePtr));
  820. extern    void        NetDFXmitFlushQ _ARGS_((NetDFState *statePtr));
  821. extern    ReturnStatus    NetDFOutputSmtPacket _ARGS_((NetDFState *statePtr));
  822.  
  823. /*
  824.  * Routines for the receive unit.
  825.  */
  826.  
  827. extern    void        NetDFRecvInit _ARGS_((NetDFState *statePtr));
  828. extern    ReturnStatus    NetDFRecvProcess _ARGS_((Boolean dropPackets,
  829.                 NetLEState *statePtr));
  830.  
  831. #endif
  832.